var websock = null
let rec // 断线重连后，延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
let isConnect = false // 连接标识 避免重复连接
// const checkMsg = 'heartbeat' // 心跳发送/返回的信息 服务器和客户端收到的信息内容如果如下 就识别为心跳信息 不要做业务处理
// 回调函数
var globalCallback = function () {}
const webSocketType = {
  Error: 0, // 错误
  GroupList: 1, // 获取客户端列表
  GroupChat: 2, // 群聊
  SingleChat: 3, // 私聊
  SingleFab: 4, // 点赞消息
  SingleCom: 5 // 评论消息
}
// 将对象转换为字符串
function createMessage (type, data, to) {
  return JSON.stringify({
    type,
    data,
    to
  })
}

const createWebSocket = () => {
  try {
    var ws = 'ws://129.204.200.3:3001'
    websock = new WebSocket(ws)
    initWebSocket() // 初始化websocket连接
  } catch (e) {
    console.log('尝试创建连接失败')
    reConnect() // 如果无法连接上webSocket 那么重新连接！可能会因为服务器重新部署，或者短暂断网等导致无法创建连接
  }
}

// 定义重连函数
const reConnect = () => {
  console.log('尝试重新连接')
  if (isConnect) return // 如果已经连上就不在重连了
  rec && clearTimeout(rec)
  rec = setTimeout(function () { // 延迟5秒重连  避免过多次过频繁请求重连
    createWebSocket()
  }, 5000)
}
// 设置关闭连接
const closeWebSocket = () => {
  webSocket.close()
}

// 初始化websocket
function initWebSocket () {
  // ws地址 -->这里是你的请求路径

  const token = localStorage.getItem('token')
  var ws = `ws://129.204.200.3:3001?token=${token}`
  websock = new WebSocket(ws)
  websock.onmessage = function (e) {
    websocketonmessage(e)
  }
  websock.onclose = function (e) {
    websocketclose(e)
  }
  websock.onopen = function () {
    websocketOpen()
    // heartCheck.start();
  }

  // 连接发生错误的回调方法
  websock.onerror = function () {
    console.log('WebSocket连接发生错误')
    isConnect = false // 连接断开修改标识
    reConnect() // 连接错误 需要重连
  }
}
// 链接成功
function websocketOpen () {
  console.log('链接成功')
}
// 监听消息
function websocketonmessage (e) {
  const msgObj = JSON.parse(e.data)
  // console.log(msgObj, '监听到的消息')
  switch (msgObj.type) {
    case webSocketType.Error:
      break
    case webSocketType.GroupList:
      // console.log(JSON.parse(msgObj.data), '当前在线的用户数量')
      // let
      globalCallback(JSON.parse(msgObj.data))
      break
    case webSocketType.GroupChat:
      break
    case webSocketType.SingleChat:
      // console.log(msgObj, '私聊的内容')
      globalCallback(msgObj.data)
      break
    case webSocketType.SingleFab:
      console.log(msgObj, '点赞消息')
      globalCallback(msgObj.data)
      break
    case webSocketType.SingleCom:
      console.log(msgObj, '评论消息')
      globalCallback(msgObj.data)
      break
  }
}
// 实际调用的发送消息的方法
function sendSock (agentData, callback) {
  //
  globalCallback = callback

  if (websock.readyState === websock.OPEN) {
    // 若是ws开启状态
    websocketsend(agentData)
  } else if (websock.readyState === websock.CONNECTING) {
    // 若是 正在开启状态，则等待1s后重新调用
    setTimeout(function () {
      sendSock(agentData, callback)
    }, 1000)
  } else {
    // 若未开启 ，则等待1s后重新调用
    setTimeout(function () {
      sendSock(agentData, callback)
    }, 1000)
  }
}

// 实际调用的获取到信息的方法
function getSock (callback) {
  globalCallback = callback
}
// 数据发送
function websocketsend (agentData) {
  const { type, data, id } = agentData
  websock.send(createMessage(type, data, id))
  console.log(agentData, '数据发送')
}
// 用户离线
function websocketclose () {
  isConnect = false // 断开后修改标识
}

initWebSocket()

// 将方法暴露出去
export {
  webSocketType,
  sendSock,
  getSock,
  createWebSocket,
  closeWebSocket

}
